package uy.com.csi.gestpro.model.ejbbean;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import uy.com.csi.gestpro.dto.ActividadAvanceDto;
import uy.com.csi.gestpro.model.ejbremote.ActividadEjbRemote;
import uy.com.csi.gestpro.model.proyecto.GpActvdadFtra;
import uy.com.csi.gestpro.model.proyecto.GpAvnce;
import uy.com.csi.gestpro.model.proyecto.GpDstrbcion;
import uy.com.csi.gestpro.model.proyecto.GpInfrmeDrio;
import uy.com.csi.gestpro.model.proyecto.GpTraFtra;
import uy.com.csi.gestpro.model.view.GpVwActvdad;
import uy.com.csi.gestpro.model.view.GpVwActvdadFtro;

@Stateless
public class ActividadEjb implements ActividadEjbRemote {
	@PersistenceContext(name = "pu_gestpro")
	EntityManager em;

	public ActividadEjb() {
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpVwActvdad> getActvdadByInfrmeTpoLst(Integer idInfrme, Integer tipo) {
		List<GpVwActvdad> actvidadLst = null;
		try {
			String consulta = "select ac from GpVwActvdad ac where ac.idInfrmeDrio=:idInfrme and ac.tpo=:tpo order by ac.idGrpoActvdad asc, ac.idActvdad asc";
			Query q = em.createQuery(consulta);
			q.setParameter("idInfrme", idInfrme);
			q.setParameter("tpo", tipo);
			actvidadLst = (List<GpVwActvdad>) q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return actvidadLst;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpVwActvdad> getActvdadNew(Integer idPy, Integer tipo) {
		List<GpVwActvdad> lstAct = null;
		try {
			String sql = "select gp from GpDstrbcion gp where gp.gpGrpoActvdad.gpPrycto.id=:idPy and gp.gpGrpoActvdad.tpo=:tpo order by gp.gpGrpoActvdad.id asc, gp.gpActvdad.id asc";
			Query q = em.createQuery(sql);
			q.setParameter("idPy", idPy);
			q.setParameter("tpo", tipo);
			List<GpDstrbcion> lst = q.getResultList();
			if (lst != null && !lst.isEmpty()) {
				lstAct = new ArrayList<GpVwActvdad>();
				for (GpDstrbcion dst : lst) {
					GpVwActvdad act = new GpVwActvdad();
					act.setIdAvnce((lstAct.size() + 1) * -1);
					act.setIdDstrbcion(dst.getId());
					act.setPrcntaje(0.0);
					act.setIdUndadMdda(dst.getGpUndadMdda().getId());
					act.setNmbreUndadMdda(dst.getGpUndadMdda().getNmbre());
					act.setIndcdor(dst.getGpUndadMdda().getIndcdor());
					act.setTpo(dst.getGpGrpoActvdad().getTpo());
					act.setNmbreGrpoAcvdad(dst.getGpGrpoActvdad().getNmbre());
					act.setIdGrpoActvdad(dst.getGpGrpoActvdad().getId());
					act.setNmbreActvdad(dst.getGpActvdad().getNmbre());
					act.setIdActvdad(dst.getGpActvdad().getId());
					lstAct.add(act);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstAct;
	}

	@Override
	public int mergeActvdads(List<ActividadAvanceDto> actLst) {
		try {
			if (actLst != null && !actLst.isEmpty()) {
				for (ActividadAvanceDto a : actLst) {
					for (GpVwActvdad act : a.getActvdadLst()) {
						String sql = "update GpAvnce a set a.prcntaje=:prcntje where a.id=:id";
						Query q = em.createQuery(sql);
						q.setParameter("prcntje", act.getPrcntaje());
						q.setParameter("id", act.getIdAvnce());
						q.executeUpdate();
					}
				}
			}
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int addActvdads(List<ActividadAvanceDto> actLst, GpInfrmeDrio infDrio) {
		try {
			if (actLst != null && !actLst.isEmpty()) {
				for (ActividadAvanceDto a : actLst) {
					for (GpVwActvdad act : a.getActvdadLst()) {
						GpAvnce av = new GpAvnce();
						av.setId(null);

						GpDstrbcion d = new GpDstrbcion();
						d.setId(act.getIdDstrbcion());
						av.setGpDstrbcion(d);

						av.setGpInfrmeDrio(infDrio);

						av.setPrcntaje(act.getPrcntaje());

						em.persist(av);
					}
				}
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpVwActvdadFtro> getActvdadFtrosByInfrme(Integer idInforme) {
		List<GpVwActvdadFtro> actvdadFtros = null;
		try {
			String consulta = "select af from GpVwActvdadFtro af where af.idInfrmeDrio=:idInfrme";
			Query q = em.createQuery(consulta);
			q.setParameter("idInfrme", idInforme);
			actvdadFtros = (List<GpVwActvdadFtro>) q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return actvdadFtros;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpTraFtra> getGpTraFtraLst() {
		List<GpTraFtra> ftraList = null;
		try {
			Query q = em.createQuery("select t from GpTraFtra t order by t.dscrpcion");
			ftraList = (List<GpTraFtra>) q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ftraList;
	}

	@Override
	public GpTraFtra getGpTraFtraById(Integer id) {
		GpTraFtra ftra = null;
		try {
			Query q = em.createQuery("select t from GpTraFtra t where t.id=:id");
			q.setParameter("id", id);
			ftra = (GpTraFtra) q.getSingleResult();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ftra;
	}

	@Override
	public int removeActividadFtroLst(List<GpVwActvdadFtro> actFtro){
		try{
			if(actFtro!=null && !actFtro.isEmpty()){
				for(GpVwActvdadFtro act : actFtro){
					String consulta = "delete from GpActvdadFtra af where af.id=:id";
					Query q = em.createQuery(consulta);
					q.setParameter("id", act.getId());
					q.executeUpdate();
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int addActividadFtroLst(List<GpVwActvdadFtro> actFtro, GpInfrmeDrio infDrio){
		try{
			if(actFtro!=null && !actFtro.isEmpty()){
				for(GpVwActvdadFtro act : actFtro){
					GpActvdadFtra a = new GpActvdadFtra();
					a.setId(null);
					a.setGpInfrmeDrio(infDrio);
					
					GpTraFtra tf = new GpTraFtra();
					tf.setId(act.getIdTraFtra());
					a.setGpTraFtra(tf);
					em.persist(a);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return 0;
	}
}
